ݺߣ

ݺߣShare a Scribd company logo
Erlyvideo
потоковое видео на Erlang
           Макс Лапшин
        max@maxidoors.ru
        http://erlyvideo.org/
Что такое стриминг?
Ютуб — это не стриминг.
10 минут видео раздаются nginx
Что же такое «стриминг»?
Пользовательское ТВ
Пользовательское ТВ
•   Пользователь загружает видеофайлы
Пользовательское ТВ
•   Пользователь загружает видеофайлы

•   Составляет плейлист
Пользовательское ТВ
•   Пользователь загружает видеофайлы

•   Составляет плейлист

•   По запросу других плейлист начинает проигрываться
Пользовательское ТВ
•   Пользователь загружает видеофайлы

•   Составляет плейлист

•   По запросу других плейлист начинает проигрываться

•   Если никому не нужно, то видео не играется
Может всё таки nginx?
nginx не справится с
организацией видеопотока
Для этой задачи нужен стример
Что делает стример?
•   Распаковывает видео и аудио из файловых контейнеров
Что делает стример?
•   Распаковывает видео и аудио из файловых контейнеров

•   Упаковывает в транспортный контейнер
Что делает стример?
•   Распаковывает видео и аудио из файловых контейнеров

•   Упаковывает в транспортный контейнер

•   Посылает кадры синхронно с реальным временем
Отступление про кодеки
•   Кодек — формат представления сжатых аудио и видео данных

•   Контейнер — формат упаковки одного и более потоков аудио и
    видео в файле или в потоке

•   H.264/AAC — лучшие кодеки

•   MP4 — самый компактный файловый контейнер
Этапы User TV
•   Скачать плейлист

•   Распаковать файл

•   Упаковать кадры в транспортный контейнер (RTMP, MPEG-TS,…)

•   Зачистить всё, когда уйдут клиенты

•   Позволить обновить код, не отключая клиентов
Традиционные способы решения
•   Red5, Wowza — Java

•   rtmpd — C++
Парсинг mp3 на Java
if (id3v1 instanceof ID3V1_1Tag) {

 try {

   // Add the track property

   graph.add(mp3Resource, processor.resolveIdentifier(IdentifierProcessor.TRCK),

         factory.createLiteral("" + ((ID3V1_1Tag) id3v1).getAlbumTrack()));

 } catch (GraphException graphException) {

   throw new ParserException(

         "Unable to add track number to id3v1 resource.",

         graphException);

 } catch (GraphElementFactoryException graphElementFactoryException) {

   throw new ParserException(

         .... ещё 600 строк кода
Парсинг mp3 на Erlang
decode(<<2#11111111111:11, VsnBits:2, LayerBits:2, _:1, BitRate:4, _/binary>> = Packet) ->

 Layer = layer(LayerBits),

 Version = version(VsnBits),

 <<Frame:(framelength(bitrate({Version,Layer}, BitRate))/binary, Rest/binary>> = Packet,

 {ok, Frame, Rest}.
Меньше кода,
меньше места ошибкам
Тысячи клиентов — новые
       проблемы
Проблемы классических
решений при тысячах клиентов
•   Управление памятью: утекание, либо преждевременное
    высвобождение

•   Контроль за ресурсами клиентов

•   Хаотическое разрушение системы при сбое в одном месте

•   Ввод/вывод при обслуживании тысяч клиентов
Red5 валится под 100
  пользователями
Wowza распухает при сложной
       бизнес-логике
epoll/kqueue сложны для долгих
        соединений из-за
      управления памятью
rtmpd сваливается в core dump
ежедневно из-за мелких сбоев
Корни проблем
•   Общая память
Корни проблем
•   Общая память

•   Передача данных по ссылкам
Web-подход:
пускай течет, скоро прибьем
        не работает
Erlang решает эти проблемы
         радикально
Процессы
•   Параллельные потоки выполнения

•   Изолированная область памяти

•   Обмен через посылку сообщений

•   Переменные неизменяемые

•   Нет данных вне процессов
Все данные хранятся внутри
  перечислимых объектов
Обработка ошибок
•   Их можно ловить

•   Если не ловить, то завершается процесс

•   Соседи об этом узнают через сообщения

•   Гарантированная зачистка ресурсов
Слежение за процессами
•   Связи

•   Супервизоры

•   appmon
В Erlang настоящее горячее
      обновление кода
Без отключения клиентов!
Какие результаты использования
            Erlang?
Erlyvideo


•   Мультипротокольный сервер

•   Держит тысячи клиентов на одном сервере

•   Существующая инфраструктура для плагинов
Решает озвученную задачу
Выводы

•   Задачи потокового видео имеют специфику, отличающую их от
    веба

•   Необходимы инструменты эффективные и высокоуровневые
    одновременно

•   Erlang прекрасно вписывается в эту нишу

•   Практическое использование показало эффективность выбора
Где ещё использовать?
Применимость erlang
•   Видеостриминг (erlyvideo)
Применимость erlang
•   Видеостриминг (erlyvideo)

•   Jabber-сервер (ejabberd)
Применимость erlang
•   Видеостриминг (erlyvideo)

•   Jabber-сервер (ejabberd)

•   Банковский процессинг (Приват Банк)
Применимость erlang
•   Видеостриминг (erlyvideo)

•   Jabber-сервер (ejabberd)

•   Банковский процессинг (Приват Банк)

•   Онлайн игры (Online Poker)
Вопросы?

  Макс Лапшин
max@maxidoors.ru
http://erlyvideo.org/

More Related Content

Erlyvideo — сервер потокового видео.